package com.example.backend.modules.user.service;

import com.example.backend.common.constant.CommonConstant;
import com.example.backend.common.exception.ServiceException;
import com.example.backend.common.utils.BeanUtils;
import com.example.backend.common.utils.SecurityUtils;
import com.example.backend.modules.user.dto.LoginDTO;
import com.example.backend.modules.user.dto.RegisterDTO;
import com.example.backend.modules.user.dto.UserInfoDTO;
import com.example.backend.modules.user.entity.User;
import com.example.backend.modules.user.enums.GenderEnum;
import com.example.backend.modules.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    private final AuthenticationManager authenticationManager;
    private final TokenService tokenService;

    @Transactional
    public UserInfoDTO register(RegisterDTO registerDTO) {
        // 验证密码
        if (!registerDTO.getPassword().equals(registerDTO.getConfirmPassword())) {
            throw new ServiceException("两次密码不一致");
        }

        // 验证用户名是否存在
        if (userRepository.existsByUsername(registerDTO.getUsername())) {
            throw new ServiceException("用户名已存在");
        }

        // 验证手机号是否存在
        if (registerDTO.getPhone() != null && userRepository.existsByPhone(registerDTO.getPhone())) {
            throw new ServiceException("手机号已存在");
        }

        // 验证邮箱是否存在
        if (registerDTO.getEmail() != null && userRepository.existsByEmail(registerDTO.getEmail())) {
            throw new ServiceException("邮箱已存在");
        }

        // 创建用户
        User user = new User();
        BeanUtils.copyProperties(registerDTO, user);
        user.setPassword(passwordEncoder.encode(registerDTO.getPassword()));
        user = userRepository.save(user);

        // 生成token
        String token = tokenService.generateToken(user);

        // 返回用户信息
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        BeanUtils.copyProperties(user, userInfoDTO);
        userInfoDTO.setToken(token);
        return userInfoDTO;
    }

    public UserInfoDTO login(LoginDTO loginDTO) {
        // 认证
        Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(loginDTO.getUsername(), loginDTO.getPassword())
        );

        // 获取用户信息
        User user = userRepository.findByUsername(loginDTO.getUsername())
            .orElseThrow(() -> new ServiceException("用户不存在"));

        // 生成token
        String token = tokenService.generateToken(user);

        // 返回用户信息
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        BeanUtils.copyProperties(user, userInfoDTO);
        userInfoDTO.setToken(token);
        return userInfoDTO;
    }

    /**
     * 获取当前用户信息
     */
    public UserInfoDTO getCurrentUserInfo() {
        User user = SecurityUtils.getCurrentUser();
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        BeanUtils.copyProperties(user, userInfoDTO);
        return userInfoDTO;
    }

    /**
     * 更新当前用户信息
     */
    @Transactional
    public UserInfoDTO updateCurrentUserInfo(UserInfoDTO userInfoDTO) {
        // 获取当前用户
        User user = SecurityUtils.getCurrentUser();
        
        // 验证手机号唯一性
        if (userInfoDTO.getPhone() != null && !userInfoDTO.getPhone().equals(user.getPhone())) {
            if (userRepository.existsByPhoneAndIdNot(userInfoDTO.getPhone(), user.getId())) {
                throw new ServiceException("手机号已被使用");
            }
        }

        // 验证邮箱唯一性
        if (userInfoDTO.getEmail() != null && !userInfoDTO.getEmail().equals(user.getEmail())) {
            if (userRepository.existsByEmailAndIdNot(userInfoDTO.getEmail(), user.getId())) {
                throw new ServiceException("邮箱已被使用");
            }
        }

        // 验证性别枚举值
        if (userInfoDTO.getGender() != null) {
            GenderEnum genderEnum = userInfoDTO.getGender();
            if (genderEnum == null) {
                throw new ServiceException("无效的性别值");
            }
        }

        user.setRealName(userInfoDTO.getRealName());
        user.setPhone(userInfoDTO.getPhone());
        user.setEmail(userInfoDTO.getEmail());
        user.setGender(userInfoDTO.getGender());
        user.setBirthDate(userInfoDTO.getBirthDate());
        user.setAvatar(userInfoDTO.getAvatar());

        // 更新用户信息
        user = userRepository.save(user);

        // 返回更新后的用户信息
        UserInfoDTO updatedUserInfo = new UserInfoDTO();
        BeanUtils.copyProperties(user, updatedUserInfo);
        return updatedUserInfo;
    }
} 